home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Die Speccy' 97
/
Die Speccy' 97.iso
/
amiga_system
/
the_aminet
/
util
/
misc
/
patchgui.lha
/
patchGUI.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-11-02
|
21KB
|
611 lines
/* RCS:
** $Id$
**
** PatchGUI.c ⌐ Aris Basic
**
**
*/
/*FOLDER Global Vars,Includes,Declarations,Macros
*/
#include <custom/mui_standard.h>
#include <string.h>
//#include "patchGUI_cat.h"
struct LocaleBase *LocaleBase;
struct Library *IconBase;
struct Catalog *mycatalog;
#define setmnlabel(number,label,comm) mn_data[number].nm_Label=getstring(label);\
mn_data[number].nm_CommKey=((comm)?getstring(comm):0)
#define sepBAR RectangleObject,\
MUIA_Rectangle_HBar,TRUE,\
MUIA_FixHeight,15,\
End
#define textGAD(txt,prep) TextObject,\
MUIA_Background,MUII_TextBack,\
MUIA_Frame,MUIV_Frame_Text,\
MUIA_Text_Contents,(char *)txt,\
MUIA_Text_PreParse,(prep?prep:""),\
MUIA_Text_SetMin,TRUE,\
End
#define ENVPATH "ENV:PATCHGUI"
#define ENVARCPATH "ENVARC:PATCHGUI"
#define ARGPAT "PRGNAME/K/A,FORMAT/K/A"
#define NAVODNIK '"'
enum { ID_DELETE=1,ID_EDIT,ID_CONFIG,ID_CONFIGC,ID_CONFIGOK,ID_DO,};
APTR App,win,configroup;
APTR bt_quit,bt_do,info;
APTR dlist,bt_delete,bt_edit;
APTR confwin,str_prg,pop_prg,str_name,str_format;
APTR str_info,bt_c_cancel,bt_c_ok;
APTR str_fnew,str_fold,str_fpatch,pop_fnew,pop_fold,pop_fpatch;
APTR bt_c_help,bt_about;
struct mydata {
char name[35];
char prgname[35];
char format[60];
char info[256];
};
struct myarg {
char *prgname;
char *format;
};
struct mydata data;
int error;
struct FileInfoBlock *cname;
char help[256];
/*END*/
/*
** Procedure cpyfileENV (Copy Config To Env)
**
** void cpyfileEMV(char *name)
**
** INPUT:
** char *name <- Filename without Path
**
** OUTPUT:
** none
**
*/
/*FOLDER cpyfileENV
*/
void cpyfileENV(char *name)
{
char *envname=(char *)malloc(sizeof(char)*256);
char *envarcname=(char *)malloc(sizeof(char)*256);
char *buffer=(char *)malloc(sizeof(char)*256);
sprintf(envname,"%s/%s",ENVPATH,name);
sprintf(envarcname,"%s/%s",ENVARCPATH,name);
sprintf(buffer,"copy %s TO %s QUIET",envarcname,envname);
System(buffer,TAG_DONE);
}
/*END*/
/*
** Function rconfig (ReadConfig)
**
** struct mydata config=rconfig(char *name)
**
** INPUT:
** char *name <- Name of Config File
** (ENV:PATCHGUI/ will be added to name)
**
** OUTPUT:
** struct mydata *config <- Readed Configuration
** config.name == NULL if somthings wrong in Configuration
** config.info == Error Text
**
*/
/*FOLDER ReadConfig
*/
struct mydata rconfig(char *name)
{
BPTR conf;
struct mydata rconf;
char *rname=(char *)malloc(sizeof(char)*256),*cinfo=(char *)malloc(sizeof(char)*256);
char *confline=(char *)malloc(sizeof(char)*256);
struct myarg args;
struct RDArgs *rdargs;
sprintf(rname,"%s/%s",ENVPATH,name);
if (conf=Open(rname,MODE_OLDFILE)) {
FGets(conf,confline,256);
FGets(conf,cinfo,256);
Close(conf);
strcpy(rconf.info,cinfo);
strcpy(rconf.name,name);
if ((rdargs=AllocDosObject(DOS_RDARGS,NULL))!=NULL) {
rdargs->RDA_Source.CS_Buffer=confline;
rdargs->RDA_Source.CS_Length=strlen(confline);
rdargs->RDA_Source.CS_CurChr=0;
rdargs->RDA_DAList=NULL;
rdargs->RDA_Buffer=NULL;
rdargs->RDA_Flags=RDAF_NOPROMPT;
if ((rdargs=ReadArgs(ARGPAT,(long *)&args,rdargs))!=NULL) {
strcpy(rconf.prgname,args.prgname);
strcpy(rconf.format,args.format);
FreeArgs(rdargs);
}
else {
strcpy(rconf.info,"Somthing is Wrong With This Config!\nCheck it !!!");
strcpy(rconf.prgname,"ERROR");
}
FreeDosObject(DOS_RDARGS,rdargs);
}
else {
strcpy(rconf.info,"Could Not Allocate Memory !");
strcpy(rconf.prgname,"ERROR");
}
return(rconf);
}
strcpy(rconf.info,"Error With File!");
strcpy(rconf.prgname,"ERROR");
return(rconf);
}
/*END*/
/*
** Procedure wconfig (WriteConfig)
**
** void wconfig(struct mydata data)
**
** INPUT:
** struct mydata *data <- Ptr To Structure With Configuration Datas
**
** OUTPUT:
** none
**
*/
/*FOLDER WriteConfig
*/
BOOL wconfig(struct mydata data)
{
BPTR file,lock;
char *fullinfo=(char *)malloc(sizeof(char)*256);
char *fullconfig=(char *)malloc(sizeof(char)*256);
char *filename=(char *)malloc(sizeof(char)*256);
if (strlen(data.format)<=0) {
MUI_Request(App,win,NULL,0,"*_OK","There Is No FORMAT In Configuration\n And You must have them !!",TAG_DONE);
return(FALSE);
}
if (data.name!=NULL) {
sprintf(filename,"%s/%s",ENVARCPATH,data.name);
if ((file=Open(filename,MODE_NEWFILE))==NULL) {
if ((lock=CreateDir(ENVARCPATH))==NULL) {
puts("Cold Not Save Config");
return(FALSE);
}
UnLock(lock);
}
sprintf(fullconfig,"PRGNAME=%s FORMAT=%c%s%c",data.prgname,NAVODNIK,data.format,NAVODNIK);
sprintf(fullconfig,"%s\n",fullconfig);
sprintf(fullinfo,"%s\n",data.info);
FPuts(file,fullconfig);
FPuts(file,fullinfo);
Close(file);
cpyfileENV(data.name);
return(TRUE);
}
}
/*END*/
/*
** Procedure setconfwin (Set Config Window)
**
** void setconfwin(struct mydata data)
**
** INPUT:
** struct mydata data <- Configuration Structure Reded from File
**
** OUTPUT:
** none
**
*/
/*FOLDER Set Config Window
*/
void setconfwin(struct mydata data)
{
setstring(str_info,data.info);
setstring(str_name,data.name);
setstring(str_prg,data.prgname);
setstring(str_format,data.format);
}
/*END*/
/*
** Procedure getconfwin (Get Config Window)
**
** struct mydata data=getconfwin(void)
**
** INPUT:
** none
**
** OUTPUT:
** mydata structure of configuration
**
*/
/*FOLDER Get Config Window
*/
struct mydata getconfwin(void)
{
struct mydata data;
char *help;
getstring(str_info,&help);
strcpy(data.info,help);
getstring(str_name,&help);
strcpy(data.name,help);
getstring(str_prg,&help);
strcpy(data.prgname,help);
getstring(str_format,&help);
strcpy(data.format,help);
return(data);
}
/*END*/
/*
** Function Parse CommandLine
**
** char *parsecmdline(struct mydata data)
**
*/
/*FOLDER ParseCMDLine
*/
char *parsecmdline(struct mydata data,char *filenew,char *fileold,char *filepatch)
{
char *cmdline=(char *)malloc(sizeof(char)*256);
char *format=(char *)malloc(sizeof(char)*256);
char help;
int a=0;
if ((strlen(data.format)<=0)) return("ERROR");
strcpy(format,data.format);
sprintf(cmdline,"%s ",data.prgname);
help=format[a++];
while(a<=strlen(format)) {
switch(help) {
case '%':
switch(format[a++]) {
case '%':
sprintf(cmdline,"%s%c",cmdline,'%');
break;
case 'f':
switch(format[a++]) {
case 'n':
sprintf(cmdline,"%s%s",cmdline,filenew);
break;
case 'p':
sprintf(cmdline,"%s%s",cmdline,filepatch);
break;
case 'o':
sprintf(cmdline,"%s%s",cmdline,fileold);
break;
}
break;
}
break;
default:
sprintf(cmdline,"%s%c",cmdline,help);
break;
}
help=format[a++];
}
return(cmdline);
}
/*END*/
/*
** Hook Function ABout
*/
/*FOLDER About HOOK
*/
_HOOK_FUNC (void,mabout,struct Hook *hook,APTR obj,APTR dummy)
{
MUI_Request(App,win,0,NULL,"*_OK","\033c\033bPatchGUI 00.10"
"\033n\n⌐ Aris Basic 1995\n\n"
"Contact me on:\naris@pwe.augusta.de"
"\n\n\033bThis is MUI Application\n"
"MUI ⌐ Stefan Stuntz",TAG_DONE);
}
struct Hook mabout_hook={
{NULL,NULL},
(void *)mabout,
NULL,NULL
};
/*END*/
/*
** Hook Function Help
*/
/*FOLDER Config Help HOOK
*/
_HOOK_FUNC (void,chelp,struct Hook *hook,APTR obj,APTR dummy)
{
MUI_Request(App,confwin,0,NULL,"*_OK","\033c\033bHELP\n\033nfor Format"
" field:\n\n\033l"
"%%%% - puts char %% on this place\n"
"%%fo - puts Filename from OldFilename gadget\n"
"%%fn - puts Filename from NewFilename gadget\n"
"%%fp - puts Filename from PatchFilename gadget\n"
"\n\n\033b\033rPatchGUI ⌐ Aris Basic",TAG_DONE);
}
struct Hook chelp_hook={
{NULL,NULL},
(void *)chelp,
NULL,NULL
};
/*END*/
/*
** Hook Function Do
*/
/*FOLDER Do HOOK
*/
_HOOK_FUNC (void,do_that,struct Hook *hook,APTR obj,APTR dummy)
{
char *fnew,*fold,*fpatch,*cmdline,*infoline=(char *)malloc(sizeof(char)*256);
DoMethod(dlist,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&cname);
if (cname==NULL)
{
MUI_Request(App,win,0,NULL,"*_OK","\033cYou Haven`t Double Click On Configuration!!",TAG_DONE);
set(info,MUIA_Text_Contents,"\033bERROR !!!\033n\nYou Haven`t Chose Configuartion!");
return;
}
stccpy(help,cname->fib_FileName,strlen(cname->fib_FileName));
error=Stricmp(data.name,help);
if (!error)
{
data=rconfig(cname->fib_FileName);
}
if (!Stricmp(data.prgname,"ERROR"))
{
MUI_Request(App,win,0,NULL,"*_OK","\033cSomthings Wrong With Configuration !\nMaybe it isn`t Loaded ?!\nDouble Click on Configuration for Your Program !!",TAG_END);
set(info,MUIA_Text_Contents,"Error With Configuration");
return;
}
getstring(str_fnew,&fnew);
getstring(str_fold,&fold);
getstring(str_fpatch,&fpatch);
cmdline=parsecmdline(data,fnew,fold,fpatch);
sprintf(infoline,"\033bNow Doing:\033n\n %s",cmdline);
set(info,MUIA_Text_Contents,infoline);
set(win,MUIA_Window_Sleep,TRUE);
error=System(cmdline,TAG_DONE);
set(win,MUIA_Window_Sleep,FALSE);
if (error)
{
sprintf(infoline,"\033bThere Was Error : %d !!\033n\nProbably Error in Format or Arguments",error);
set(info,MUIA_Text_Contents,infoline);
}
else
{
set(info,MUIA_Text_Contents,"\033bDone\n\033nEverything is OK !!");
}
}
struct Hook do_hook = {
{NULL,NULL},
(void *)do_that,
NULL,NULL
};
/*END*/
/*Main*/
/*FOLDER Main
*/
void main(void)
{
BOOL running=TRUE;
long signals,id;
init();
/*FOLDER Configuration Window
*/
confwin=WindowObject,
MUIA_Window_ID,MAKE_ID('C','O','N','F'),
MUIA_Window_Title,"PatchGUI Configuration",
WindowContents,VGroup,
Child,textGAD("Configuration Editor","\033c"),
Child,sepBAR,
Child,ColGroup(2),
Child,Label("Config Name"),
Child,str_name=StringObject,
StringFrame,
MUIA_String_MaxLen,35,
End,
Child,Label("Program Name"),
Child,pop_prg=PopaslObject,
MUIA_Popstring_String,str_prg=StringObject,
StringFrame,
MUIA_String_MaxLen,75,
End,
MUIA_Popstring_Button,PopButton(MUII_PopFile),
ASLFR_SleepWindow,TRUE,
End,
Child,Label("Format"),
Child,str_format=StringObject,
StringFrame,
MUIA_String_MaxLen,50,
End,
Child,Label("Configuration Info"),
Child,str_info=StringObject,
StringFrame,
MUIA_String_MaxLen,255,
End,
End,
Child,sepBAR,
Child,bt_c_help=SimpleButton("Help"),
Child,HGroup,
Child,bt_c_ok=SimpleButton("Ok"),
Child,bt_c_cancel=SimpleButton("Cancel"),
End,
End,
End;
/*END*/
/*FOLDER Configuration Group (MaIn Window)
*/
configroup=VGroup,
GroupFrameT("Chose Config"),
Child,dlist=ListviewObject,
MUIA_Listview_Input,TRUE,
MUIA_Listview_List,DirlistObject,
MUIA_Background,MUII_ListBack,
InputListFrame,
MUIA_Dirlist_Directory,"ENV:PATCHGUI/",
MUIA_Dirlist_FilesOnly,TRUE,
MUIA_List_Format," ",
End,
End,
Child,HGroup,
Child,bt_delete=SimpleButton("Delete"),
Child,bt_edit=SimpleButton("Edit"),
End,
End;
/*END*/
App=ApplicationObject,
MUIA_Application_Title,"PatchGUI",
MUIA_Application_Version,"$VER: PatchGUI 00.10 (27.10.95)",
MUIA_Application_Copyright,"⌐ 1995 Aris Basic",
MUIA_Application_Author,"Aris Basic",
MUIA_Application_Description,"GUI for spatch and more",
MUIA_Application_Base,"PATCHGUI",
MUIA_Application_Window,win=WindowObject,
MUIA_Window_ID,MAKE_ID('M','A','I','N'),
MUIA_Window_Title,"PatchGUI",
WindowContents,VGroup,
Child,textGAD("\0338PatchGUI 00.10 ⌐ Aris Basic","\033c"),
Child,info=textGAD("\033bWelcome To PatchGUI\033n\n(Double Click On Configuration to Use,Edit or Delete it)","\033c"),
Child,HGroup,
Child,ColGroup(2),
Child,VSpace(8),
Child,VSpace(8),
Child,Label("New FileName"),
Child,pop_fnew=PopaslObject,
MUIA_Popstring_String,str_fnew=StringObject,
StringFrame,
MUIA_String_MaxLen,256,
End,
MUIA_Popstring_Button,PopButton(MUII_PopFile),
ASLFR_SleepWindow,TRUE,
End,
Child,Label("Old FileName"),
Child,pop_fold=PopaslObject,
MUIA_Popstring_String,str_fold=StringObject,
StringFrame,
MUIA_String_MaxLen,256,
End,
MUIA_Popstring_Button,PopButton(MUII_PopFile),
ASLFR_SleepWindow,TRUE,
End,
Child,Label("Patch FileName"),
Child,pop_fpatch=PopaslObject,
MUIA_Popstring_String,str_fpatch=StringObject,
StringFrame,
MUIA_String_MaxLen,256,
End,
MUIA_Popstring_Button,PopButton(MUII_PopFile),
ASLFR_SleepWindow,TRUE,
End,
Child,VSpace(4),
Child,VSpace(4),
End,
Child,configroup,
End,
Child,sepBAR,
Child,bt_about=SimpleButton("About"),
Child,HGroup,
Child,bt_do=SimpleButton("Do"),
Child,bt_quit=SimpleButton("Quit"),
End,
End,
End,
SubWindow,confwin,
End;
DoMethod(win,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,App,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
DoMethod(dlist,MUIM_Notify,MUIA_Listview_DoubleClick,TRUE,App,2,MUIM_Application_ReturnID,ID_CONFIG);
DoMethod(bt_edit,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,ID_EDIT);
DoMethod(confwin,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,App,2,MUIM_Application_ReturnID,ID_CONFIGC);
DoMethod(bt_c_cancel,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,ID_CONFIGC);
DoMethod(bt_c_ok,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,ID_CONFIGOK);
DoMethod(bt_delete,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,ID_DELETE);
DoMethod(bt_do,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_CallHook,&do_hook);
DoMethod(bt_quit,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
DoMethod(bt_about,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_CallHook,&mabout_hook);
DoMethod(bt_c_help,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_CallHook,&chelp_hook);
set(win,MUIA_Window_Open,TRUE);
while (running) {
switch (id=DoMethod(App,MUIM_Application_Input,&signals))
{
case MUIV_Application_ReturnID_Quit:
running=FALSE;
break;
case ID_CONFIG:
DoMethod(dlist,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&cname);
data=rconfig(cname->fib_FileName);
set(info,MUIA_Text_Contents,data.info);
break;
case ID_EDIT:
DoMethod(dlist,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&cname);
if (cname==NULL) {
stccpy(data.prgname,"Unknown",8);
stccpy(data.name,"Unnamed",8);
stccpy(data.format," ",1);
stccpy(data.info,"Unnamed Configuartion",22);
}
else if (!stricmp(data.name,cname->fib_FileName))
data=rconfig(cname->fib_FileName);
setconfwin(data);
set(confwin,MUIA_Window_Open,TRUE);
set(win,MUIA_Window_Sleep,TRUE);
break;
case ID_CONFIGOK:
set(confwin,MUIA_Window_Open,FALSE);
set(win,MUIA_Window_Sleep,FALSE);
data=getconfwin();
wconfig(data);
DoMethod(dlist,MUIM_Dirlist_ReRead);
data=rconfig(data.name);
break;
case ID_CONFIGC:
set(confwin,MUIA_Window_Open,FALSE);
set(win,MUIA_Window_Sleep,FALSE);
setconfwin(data);
data=rconfig(cname->fib_FileName);
break;
case ID_DELETE:
{
char *fname=(char *)malloc(sizeof(char)*256);
sprintf(fname,"%s%s",ENVARCPATH,data.name);
DeleteFile(fname);
sprintf(fname,"%s%s",ENVPATH,data.name);
DeleteFile(fname);
DoMethod(dlist,MUIM_Dirlist_ReRead);
}
break;
}
if (running && signals) Wait(signals);
}
set(win,MUIA_Window_Open,FALSE);
fail(App,NULL);
}
/*END*/